/**
 @file command.h
 @brief Funciones para la definición de mensajes en forma de comandos con argumentos.
 @date   15/11/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef COMMAND_H_
#define COMMAND_H_

#include "cli_message.h"
//#include "console_io.h"

//#define CMD_DEBUG

//! @brief Estructura para almacenar un comando definido por el usuario y sus argumentos.
typedef struct {

    uint8_t opt; //!< Byte de opciones del comando. Viajará en el byte de opciones de un mensaje.
    uint8_t command; //!< Byte identificador del comando. Definido por el usuario.

    uint8_t byte_num; //!< Cantidad de argumentos enteros de 8 bits.
    uint8_t short_num; //!< Cantidad de argumentos enteros de 16 bits.
    uint8_t int_num; //!< Cantidad de argumentos de tipo entero estándar.
    uint8_t float_num; //!< Cantidad de argumentos de tipo flotante.
    uint8_t double_num; //!< Cantidad de argumentos de flotantes de doble precisión.

    uint8_t *byte_args; //!< Contenedor de los argumentos enteros de 8 bits.
    short int *short_args; //!< Contenedor de los argumentos enteros de 16 bits.
    int *int_args; //!< Contenedor de los argumentos enteros estándar.
    float *float_args; //!< Contenedor de los argumentos enteros de tipo flotante.
    double *dbl_args; //!< Contenedor de los argumentos enteros de tipo flotante de doble precisión.

    char *destination; //!< Identificador del nodo destino para unicast o broadcast.
    dest_list_t *destination_list; //!< Lista de destinatarios para multicast. @see dest_list_t

}command_arg_t;

/*!
   @brief Inicializa el comando de usuario apartando la memoria necesaria para transportar los argumentos.
   @param *command Apuntador al comando de usuario a ejecutar.
   @param bytes Cantidad de argumentos enteros de 8 bits (o bien, unsigned char) del comando.
   @param short_ints Cantidad de argumentos enteros de 16bits
   @param ints Cantidad de argumentos enteros.
   @param floats Cantidad de argumentos flotantes.
   @param doubles Cantidad de argumentos de doble precisión.
   @return 0 en caso de exito. -1 en caso de error.
   @see toMsg()
 */
int commandAttrInit(command_arg_t *command, uint8_t bytes, uint8_t short_ints, uint8_t ints, uint8_t floats, uint8_t doubles);

/*!
   @brief Crea un mensaje conteniendo el comando a ejecutar y sus parámetros para enviarlo al servidor.
   @param com El comando de usuario a ejecutar.
   @param msg Apuntador al mensaje resultante de la conversión.
   @return 0 en caso de exito. -1 en caso de error.
   @see commandAttrInit()
 */
int createMsg(command_arg_t com, struct msg_t* msg);


/*!
   @brief Envía el comando al(los) destinatario(s) que contenga.
   @param com El comando a enviar. El direccionamiento sigue las mismas prioridades que el envío de mensajes. @see msgOutput()
   @return 0 en caso de exito. -1 en caso de error.
 */
int sendCommand(command_arg_t com);

//--------------------------------------------------------------------------------------------------------------------------


//#define FWD 0x77
//#define FWD_DIST 0x57
//#define FWD_PULSE 0x66
//
//#define BWD 0x73
//#define LEFT_DEG 0x61
//#define LEFT_RAD 0x41
//#define RIGHT_DEG 0x64
//#define RIGHT_RAD 0x44
//#define STOP 0x71
//#define READ 0x72
//#define SWEEP 0x62
//
//
//int avanzarDistanciaCM( uint8_t vel , unsigned short int dist, char * id , dest_list_t *list);
//
//int girarGrados (uint8_t dir,uint8_t vel, short int grados, char *id, dest_list_t *list);
//
//int girarRadianes (uint8_t dir, uint8_t vel, float radianes, char *id, dest_list_t *list);
//
//int avanzarPulsos( uint8_t vel , short int pulsos, char * id, dest_list_t *list );
//
//int avanzar (uint8_t vel, char *id, dest_list_t *list);
//
//int retroceder (uint8_t vel, char *id, dest_list_t *list);
//
//int detenerse ( char *id, dest_list_t *list);
//
//uint8_t* barridoUS(char *id, dest_list_t *list);
//
//short int sensorUSobtenerMedidaCM(char *id, dest_list_t *list);
//
//int foo_cmd (uint8_t cmd, int arg1, int arg2, int arg3, int arg4, char *id, dest_list_t *list);
//
//int foo_dbl (uint8_t cmd, int arg1, int arg2, double arg3, char *id, dest_list_t *list);
//
//void comander();

#endif /* COMMAND_H_ */
